package com.lixixi.tingshu.album.service.impl;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.lixixi.tingshu.album.mapper.BaseCategoryViewMapper;
import com.lixixi.tingshu.album.service.BaseCategoryViewService;
import com.lixixi.tingshu.model.album.BaseCategoryView;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
public class BaseCategoryViewServiceImpl extends ServiceImpl<BaseCategoryViewMapper, BaseCategoryView> implements BaseCategoryViewService {
	@Autowired
	BaseCategoryViewMapper baseCategoryViewMapper;

	@Override
	public List<JSONObject> findBaseCategory() {
		//返回值,返回全部一级分类的下的成员
		List<JSONObject> baseCategorylist = new ArrayList<>();
		//查询全部专辑分类
		List<BaseCategoryView> baseCategoryViews = baseCategoryViewMapper.selectList(null);
		//按照一级分类进行分组
		Map<Long, List<BaseCategoryView>> baseCategory1 = baseCategoryViews.parallelStream().collect(Collectors.groupingBy(BaseCategoryView::getCategory1Id));
		//依次便利一级分类下的成员
		for (Map.Entry<Long, List<BaseCategoryView>> entry : baseCategory1.entrySet())
		{
			JSONObject jsonObject1 = new JSONObject();
			Long basecategoryId = entry.getKey();
			jsonObject1.put("categoryName", entry.getValue().get(0).getCategory1Name());
			jsonObject1.put("categoryId", basecategoryId);
			//一级分类下有二级分类, 需要对二级成员进行分组便利
//			Map<Long, List<BaseCategoryView>> baseCategory2 = entry.getValue().stream().collect(Collectors.groupingBy(BaseCategoryView::getCategory2Id));
			//执行并行stream流
			Map<Long, List<BaseCategoryView>> baseCategory2 = entry.getValue().parallelStream().collect(Collectors.groupingByConcurrent(BaseCategoryView::getCategory2Id));
			//存储对应一级分类下的二级分类成员
			List<JSONObject> list1 = new ArrayList();
			for (Map.Entry<Long, List<BaseCategoryView>> entry2 : baseCategory2.entrySet())
			{
				JSONObject jsonObject2 = new JSONObject();
				Long basecategoryId2 = entry2.getKey();
				jsonObject2.put("categoryName", entry2.getValue().get(0).getCategory2Name());
				jsonObject2.put("categoryId", basecategoryId2);
				//二级分类下有三级分类, 需要对三级成员进行便利
				//存储对应二级分类下的三级分类成员
				List<JSONObject> list2 = new ArrayList();
				for (BaseCategoryView bcv : entry2.getValue())
				{
					JSONObject jsonObject3 = new JSONObject();
					jsonObject3.put("categoryName", bcv.getCategory3Name());
					jsonObject3.put("categoryId", bcv.getCategory3Id());
					//添加当前二级分类下的三级分类成员
					list2.add(jsonObject3);
				}
				jsonObject2.put("categoryChild", list2);
				//添加已填充三级分类成员的二级分类成员
				list1.add(jsonObject2);
			}
			jsonObject1.put("categoryChild", list1);
			//添加已填充二级分类成员的一级分类成员
			baseCategorylist.add(jsonObject1);
		}
		return baseCategorylist;
	}

	@Override
	public List<JSONObject> findBaseCategory(Long categoryId1) {
		//返回值,返回指定一级分类的下的成员
		List<JSONObject> baseCategorylist = new ArrayList<>();
		//查询指定一级分类id下专辑类型
		List<BaseCategoryView> baseCategory1 = baseCategoryViewMapper
				.selectList(new LambdaQueryWrapper<BaseCategoryView>()
						.eq(BaseCategoryView::getCategory1Id, categoryId1));
		//一级分类下有二级分类, 需要对二级成员进行分组便利
		Map<Long, List<BaseCategoryView>> baseCategory2 = baseCategory1.stream().collect(Collectors.groupingBy(BaseCategoryView::getCategory2Id));
		for (Map.Entry<Long, List<BaseCategoryView>> entry2 : baseCategory2.entrySet())
		{
			JSONObject jsonObject2 = new JSONObject();
			Long basecategoryId2 = entry2.getKey();
			jsonObject2.put("categoryName", entry2.getValue().get(0).getCategory2Name());
			jsonObject2.put("categoryId", basecategoryId2);
			//存储对应二级分类下的三级分类成员
			List<JSONObject> list2 = new ArrayList();
			//二级分类下有三级分类, 需要对三级成员进行便利
			for (BaseCategoryView bcv : entry2.getValue())
			{
				JSONObject jsonObject3 = new JSONObject();
				jsonObject3.put("categoryName", bcv.getCategory3Name());
				jsonObject3.put("categoryId", bcv.getCategory3Id());
				//添加当前二级分类下的三级分类成员
				list2.add(jsonObject3);
			}
			jsonObject2.put("categoryChild", list2);
			//添加已填充三级分类成员的二级分类成员
			baseCategorylist.add(jsonObject2);
		}
		return baseCategorylist;
	}

}


